<?php

namespace App\Http\Controllers;

use App\Models\Clazz;
use App\Models\Student;
use Carbon\Carbon;
use App\Models\FeedbackRecord;
use DB;
use Illuminate\Http\Request;
use Illuminate\Database\Query\JoinClause;

class TeacherController extends Controller
{
    /**
     * 列出所有班级
     */
    public function listClass()
    {
        // 获取所有班级
        $clazzes = Clazz::withCount('students')->get();;
        
        // 传递数据到视图
        return view('teacher.clazzes', compact('clazzes'));
    }

    public function listStudent($clazzId, $sort = 'n', $filter = 'c')
    {
        // 获取当前班级信息
        $clazz = Clazz::findOrFail($clazzId);
        
        // 计算目标周次（根据filter参数）
        $targetWeek = null;
        if ($filter !== 'a') { // 非"所有周"时计算周次
            $currentWeek = Carbon::now()->weekOfYear;
            $targetWeek = $filter === 'p' ? $currentWeek - 1 : $currentWeek;
            
            // 处理跨年周次
            if ($targetWeek < 1) {
                $targetWeek = Carbon::now()->subWeek()->weekOfYear;
            }
        }
        
        // 构建周次筛选条件（用于SQL语句中）
        $weekCondition = $targetWeek === null 
            ? '1 = 1'  // 所有周：条件恒为真
            : "feedback_records.week = {$targetWeek}";  // 指定周次：精确匹配
        
        // 构建查询：确保所有学生都显示，只筛选参与计分的反馈记录
        $query = Student::select(
                'students.*',
                // 在SUM中添加周次条件，只对符合条件的记录进行求和
                DB::raw("SUM(CASE WHEN feedback_records.score_change > 0 
                    AND ({$weekCondition})
                    THEN feedback_records.score_change ELSE 0 END) AS total_add"),
                DB::raw("SUM(CASE WHEN feedback_records.score_change < 0 
                    AND ({$weekCondition})
                    THEN ABS(feedback_records.score_change) ELSE 0 END) AS total_deduct")
            )
            ->leftJoin('feedback_records', function (JoinClause $join) {
                $join->on('students.id', '=', 'feedback_records.student_id')
                     ->on('students.clazz_id', '=', 'feedback_records.clazz_id');
            })
            ->where('students.clazz_id', $clazzId)
            ->groupBy('students.id');
        
        // 根据排序参数处理排序
        switch ($sort) {
            case 'n':
                // 按姓名排序（默认）
                $query->orderBy('students.first_word', 'asc');
                break;
            case 's':
                // 按总加分排序（从高到低）
                $query->orderBy('total_add', 'desc');
                break;
            case 'd':
                // 按总扣分排序（从高到低）
                $query->orderBy('total_deduct', 'desc');
                break;
            default:
                $query->orderBy('students.first_word', 'asc');
        }
        
        // 获取排序后的学生数据（包含总分）
        $students = $query->get();
        
        // 传递数据到视图
        return view('teacher.students', compact('clazz', 'students', 'sort', 'filter'));
    }

    public function feedback(Request $request)
    {
        // 验证请求数据
        $validated = $request->validate([
            'student_id' => 'required|exists:students,id', // 验证学生ID存在
            'clazz_id' => 'required|exists:clazzes,id',   // 验证班级ID存在
            'score_change' => 'required|integer',         // 分数变化必须是整数
            'reason' => 'nullable|string|max:255',        // 原因可选，字符串类型
        ]);

        try {
            // 创建新的评分记录
            FeedbackRecord::create([
                'teacher_id' => 1, // 假设使用当前登录教师ID
                'student_id' => $validated['student_id'],
                'clazz_id' => $validated['clazz_id'],
                'score_change' => $validated['score_change'],
                'reason' => $validated['reason'] ?? '',
                'feedback_time' => Carbon::now(), // 当前时间作为评价时间
                'year' => Carbon::now()->year,    // 提取年份
                'month' => Carbon::now()->month,  // 提取月份
                'week' => Carbon::now()->weekOfYear, // 提取周次
            ]);

            // 成功响应（可根据前端需求返回JSON或重定向）
            return response()->json([
                'success' => true,
                'message' => '评分记录已保存'
            ]);

            // 如果需要重定向到页面，可使用：
            // return redirect()->route('teacher.students', $validated['clazz_id'])
            //     ->with('success', '评分记录已保存');
        } catch (\Exception $e) {
            // 错误处理
            return response()->json([
                'success' => false,
                'message' => '保存失败：' . $e->getMessage()
            ], 500);
        }
    }

    public function getFeedback(Request $request)
    {
        try {
            // 获取请求中的班级ID（用于筛选该班级的反馈）
            $clazzId = $request->input('clazz_id');
            
            // 查询该班级下所有学生的反馈记录，按学生ID分组
            // 分别累加加分（score_change>0）和扣分（score_change<0）
            $feedbackList = FeedbackRecord::where('clazz_id', $clazzId)
                ->selectRaw('
                    student_id,
                    SUM(CASE WHEN score_change > 0 THEN score_change ELSE 0 END) as total_add,
                    SUM(CASE WHEN score_change < 0 THEN ABS(score_change) ELSE 0 END) as total_deduct
                ')
                ->groupBy('student_id')
                ->get();
            
            return response()->json($feedbackList);
        } catch (\Exception $e) {
            \Log::error('获取反馈数据失败: ' . $e->getMessage());
            return response()->json(['error' => '获取数据失败'], 500);
        }
    }
}
